{
 "cells": [
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "30b47030",
   "metadata": {},
   "source": [
    "# 生成式预训练语言模型：理论与实战\n",
    "深蓝学院 课程 \n",
    "课程链接：https://www.shenlanxueyuan.com/course/620\n",
    "\n",
    "作者 **黄佳**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "d3216379",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "词汇表： ['Niuzong', 'Boss', 'Xiaoxue', 'Teacher', 'Xiaobing', 'is', 'Kage', 'Mazong', 'Student']\n",
      "词汇到索引的字典： {'Niuzong': 0, 'Boss': 1, 'Xiaoxue': 2, 'Teacher': 3, 'Xiaobing': 4, 'is': 5, 'Kage': 6, 'Mazong': 7, 'Student': 8}\n",
      "索引到词汇的字典： {0: 'Niuzong', 1: 'Boss', 2: 'Xiaoxue', 3: 'Teacher', 4: 'Xiaobing', 5: 'is', 6: 'Kage', 7: 'Mazong', 8: 'Student'}\n",
      "词汇表大小： 9\n"
     ]
    }
   ],
   "source": [
    "# 定义一个句子列表，后面会用这些句子来训练CBOW和CBOW模型\n",
    "sentences = [\"Kage is Teacher\", \"Mazong is Boss\", \"Niuzong is Boss\",\n",
    "             \"Xiaobing is Student\", \"Xiaoxue is Student\",]\n",
    "# 将所有句子连接在一起，然后用空格分隔成词汇\n",
    "words = ' '.join(sentences).split()\n",
    "# 构建词汇表，去除重复的词\n",
    "word_list = list(set(words))\n",
    "# 创建一个字典，将每个词汇映射到一个唯一的索引\n",
    "word_to_idx = {word: idx for idx, word in enumerate(word_list)}\n",
    "# 创建一个字典，将每个索引映射到对应的词汇\n",
    "idx_to_word = {idx: word for idx, word in enumerate(word_list)}\n",
    "voc_size = len(word_list) # 计算词汇表的大小\n",
    "print(\"词汇表：\", word_list) # 输出词汇表\n",
    "print(\"词汇到索引的字典：\", word_to_idx) # 输出词汇到索引的字典\n",
    "print(\"索引到词汇的字典：\", idx_to_word) # 输出索引到词汇的字典\n",
    "print(\"词汇表大小：\", voc_size) # 输出词汇表大小"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "de8f4ae7",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CBOW数据样例（未编码）： [('Kage', ['is', 'Teacher']), ('is', ['Kage', 'Teacher']), ('Teacher', ['Kage', 'is'])]\n"
     ]
    }
   ],
   "source": [
    "# 生成CBOW训练数据\n",
    "def create_cbow_dataset(sentences, window_size=2):\n",
    "    data = []\n",
    "    for sentence in sentences:\n",
    "        sentence = sentence.split()  # 将句子分割成单词列表\n",
    "        for idx, word in enumerate(sentence):  # 遍历单词及其索引\n",
    "            # 获取上下文词汇，将当前单词前后各window_size个单词作为上下文词汇\n",
    "            context_words = sentence[max(idx - window_size, 0):idx] \\\n",
    "                + sentence[idx + 1:min(idx + window_size + 1, len(sentence))]\n",
    "            # 将当前单词与上下文词汇作为一组训练数据\n",
    "            data.append((word, context_words))\n",
    "    return data\n",
    "\n",
    "# 使用函数创建CBOW训练数据\n",
    "cbow_data = create_cbow_dataset(sentences)\n",
    "# 打印未编码的CBOW数据样例（前三个）\n",
    "print(\"CBOW数据样例（未编码）：\", cbow_data[:3])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "72158e33",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "One-Hot编码前的单词： Teacher\n",
      "One-Hot编码后的向量： tensor([0., 0., 0., 1., 0., 0., 0., 0., 0.])\n",
      "CBOW数据样例（已编码）： [(tensor([0., 0., 0., 0., 0., 0., 1., 0., 0.]), [tensor([0., 0., 0., 0., 0., 1., 0., 0., 0.]), tensor([0., 0., 0., 1., 0., 0., 0., 0., 0.])]), (tensor([0., 0., 0., 0., 0., 1., 0., 0., 0.]), [tensor([0., 0., 0., 0., 0., 0., 1., 0., 0.]), tensor([0., 0., 0., 1., 0., 0., 0., 0., 0.])]), (tensor([0., 0., 0., 1., 0., 0., 0., 0., 0.]), [tensor([0., 0., 0., 0., 0., 0., 1., 0., 0.]), tensor([0., 0., 0., 0., 0., 1., 0., 0., 0.])])]\n"
     ]
    }
   ],
   "source": [
    "# 定义One-Hot编码函数\n",
    "import torch # 导入torch库\n",
    "def one_hot_encoding(word, word_to_idx):\n",
    "    # 创建一个全为0的张量，长度与词汇表大小相同\n",
    "    tensor = torch.zeros(len(word_to_idx))  \n",
    "    tensor[word_to_idx[word]] = 1  # 将对应词汇的索引位置置为1\n",
    "    return tensor  # 返回生成的One-Hot向量\n",
    "\n",
    "# 展示One-Hot编码前后的数据\n",
    "word_example = \"Teacher\"\n",
    "print(\"One-Hot编码前的单词：\", word_example)\n",
    "print(\"One-Hot编码后的向量：\", one_hot_encoding(word_example, word_to_idx))\n",
    "\n",
    "# 展示编码后的CBOW数据样例\n",
    "# 展示编码后的CBOW数据样例\n",
    "print(\"CBOW数据样例（已编码）：\", [(one_hot_encoding(target, word_to_idx), \n",
    "                          [one_hot_encoding(context, word_to_idx) for context in context_words]) \n",
    "                         for target, context_words in cbow_data[:3]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "31ae5270",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CBOW模型： CBOW(\n",
      "  (input_to_hidden): Linear(in_features=9, out_features=2, bias=False)\n",
      "  (hidden_to_output): Linear(in_features=2, out_features=9, bias=False)\n",
      ")\n"
     ]
    }
   ],
   "source": [
    "# 定义CBOW模型\n",
    "import torch.nn as nn # 导入neural network# 定义CBOW模型\n",
    "class CBOW(nn.Module):\n",
    "    def __init__(self, voc_size, embedding_size):\n",
    "        super(CBOW, self).__init__()\n",
    "        # 从词汇表大小到嵌入大小的线性层（权重矩阵）\n",
    "        self.input_to_hidden = nn.Linear(voc_size, \n",
    "                                         embedding_size, bias=False)  \n",
    "        # 从嵌入大小到词汇表大小的线性层（权重矩阵）\n",
    "        self.hidden_to_output = nn.Linear(embedding_size, \n",
    "                                          voc_size, bias=False)  \n",
    "\n",
    "    def forward(self, X): # X: [num_context_words, voc_size]\n",
    "        \n",
    "        # 生成嵌入：[num_context_words, embedding_size]\n",
    "        embeddings = self.input_to_hidden(X)  \n",
    "        # 计算隐藏层，求嵌入的均值：[embedding_size]\n",
    "        hidden_layer = torch.mean(embeddings, dim=0)  \n",
    "        # 生成输出层：[1, voc_size]\n",
    "        output_layer = self.hidden_to_output(hidden_layer.unsqueeze(0)) \n",
    "        return output_layer\n",
    "    \n",
    "embedding_size = 2 # 设定嵌入层的大小，这里选择2是为了方便展示\n",
    "cbow_model = CBOW(voc_size,embedding_size)  # 实例化cbow模型\n",
    "print(\"CBOW模型：\", cbow_model)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "311ccd16",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch: 100, Loss: 2.2061463673909505\n",
      "Epoch: 200, Loss: 2.190965986251831\n",
      "Epoch: 300, Loss: 2.1757941881815595\n",
      "Epoch: 400, Loss: 2.159466520945231\n",
      "Epoch: 500, Loss: 2.1407933870951337\n",
      "Epoch: 600, Loss: 2.118474014600118\n",
      "Epoch: 700, Loss: 2.0910394827524823\n",
      "Epoch: 800, Loss: 2.05684396425883\n",
      "Epoch: 900, Loss: 2.014146931966146\n",
      "Epoch: 1000, Loss: 1.9613627910614013\n"
     ]
    },
    {
     "data": {
      "image/png": "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wcGFNj8/P+DS8NSkSZPo1q0bHh4eRERE8M033xQ6f8eOHdxxxx14eHgQEBDA448/TkZGRqFjvvzyS+rVq4fNZqNy5coMHTq00POnT5/mvvvuw9PTk5o1a7J48eKC537//XcefPBBKlWqhIeHBzVr1ryssImIfVIBEhGH9eqrr9K7d28SExPp378/DzzwALt27QLg/PnzdO3aFT8/PzZt2sQ333zDihUrChWcSZMmMWTIEB5//HF27NjB4sWLqVGjRqH3eOONN+jTpw/bt2+ne/fuPPjgg5w9e7bg/X/99VeWLl3Krl27mDRpEhUrViy9PwARuXWltuyqiMhNGDRokOHi4mJ4eXkV2t58803DMAwDMJ544olC57Rs2dJ48sknDcMwjMmTJxt+fn5GRkZGwfNLliwxrFarkZKSYhiGYVSpUsV4+eWXr5oBMF555ZWCxxkZGYbFYjGWLl1qGIZh9OjRw3jooYeK5wOLSKnSHCARsVsdO3Zk0qRJhfb5+/sX/HN0dHSh56Kjo0lISABg165dNGzYEC8vr4LnW7duTX5+Pnv27MFisXDs2DE6dep0zQwNGjQo+GcvLy+8vb05efIkAE8++SS9e/dm69atdOnShZ49e9KqVatb+qwiUrpUgETEbnl5eV02JHU9FosFAMMwCv75Ssd4eHjc0Ou5ublddm5+fj4A3bp1IykpiSVLlrBixQo6derEkCFD+Ne//nVTmUWk9GkOkIg4rPj4+MseR0ZGAlC3bl0SEhLIzMwseH7dunVYrVZq1aqFt7c3VatW5aeffipShkqVKhETE8PMmTMZP348kydPLtLriUjp0DdAImK3srOzSUlJKbTP1dW1YKLxN998Q7NmzWjTpg1ff/01GzduZMqUKQA8+OCDvP766wwaNIjRo0dz6tQphg0bxoABAwgKCgJg9OjRPPHEEwQGBtKtWzfOnTvHunXrGDZs2A3le+2112jatCn16tUjOzub//znP9SpU6cY/wREpKSoAImI3frhhx+oXLlyoX21a9dm9+7dwKUrtObMmcNTTz1FcHAwX3/9NXXr1gXA09OTZcuWMXz4cJo3b46npye9e/fm/fffL3itQYMGkZWVxQcffMBzzz1HxYoV+etf/3rD+cqVK8eoUaM4dOgQHh4etG3bljlz5hTDJxeRkmYxDMMwO4SIyM2yWCwsXLiQnj17mh1FRByQ5gCJiIiI01EBEhEREaejOUAi4pA0ei8iRaFvgERERMTpqACJiIiI01EBEhEREaejAiQiIiJORwVIREREnI4KkIiIiDgdFSARERFxOipAIiIi4nRUgERERMTp/B+ATkuQRtTGWQAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 训练CBOW模型\n",
    "learning_rate = 0.001 # 设置学习速率\n",
    "epochs = 1000 # 设置训练轮次\n",
    "criterion = nn.CrossEntropyLoss()  # 定义交叉熵损失函数\n",
    "import torch.optim as optim # 导入随机梯度下降优化器\n",
    "optimizer = optim.SGD(cbow_model.parameters(), lr=learning_rate)  \n",
    "\n",
    "# 开始训练循环\n",
    "loss_values = []  # 用于存储每轮的平均损失值\n",
    "for epoch in range(epochs):\n",
    "    loss_sum = 0\n",
    "    for target, context_words in cbow_data:\n",
    "        # 将上下文词转换为One-hot向量并堆叠\n",
    "        X = torch.stack([one_hot_encoding(word, word_to_idx) for word in context_words]).float() \n",
    "        y_true = torch.tensor([word_to_idx[target]], dtype=torch.long)  # 将目标词转换为索引值\n",
    "        y_pred = cbow_model(X)  # 计算预测值\n",
    "        loss = criterion(y_pred, y_true)  # 计算损失\n",
    "        loss_sum += loss.item()\n",
    "        optimizer.zero_grad()  # 清空梯度\n",
    "        loss.backward()  # 反向传播\n",
    "        optimizer.step()  # 更新参数\n",
    "        \n",
    "    if (epoch+1) % 100 == 0: # 输出每100轮的损失，并记录损失\n",
    "        print(f\"Epoch: {epoch+1}, Loss: {loss_sum/len(cbow_data)}\")  \n",
    "        loss_values.append(loss_sum / len(cbow_data))\n",
    "# 绘制训练损失曲线\n",
    "import matplotlib.pyplot as plt # 导入matplotlib\n",
    "plt.plot(range(1, epochs//100 + 1), loss_values) # 绘图\n",
    "plt.title('Training Loss') # 图题\n",
    "plt.xlabel('Epochs') # X轴Label\n",
    "plt.ylabel('Loss') # Y轴Label\n",
    "plt.show() # 显示图"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "75e56ed1",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "CBOW词嵌入:\n",
      "Niuzong:     [-0.40166673 -0.19157334]\n",
      "Boss:     [0.4338934 0.8685295]\n",
      "Xiaoxue:     [0.08635382 0.26821324]\n",
      "Teacher:     [-0.4247218  0.3750153]\n",
      "Xiaobing:     [-0.2253402  0.6310343]\n",
      "is:     [ 0.06209773 -0.47664768]\n",
      "Kage:     [-0.16934112  0.16144915]\n",
      "Mazong:     [-0.20209095  0.19310151]\n",
      "Student:     [0.01110522 0.5497453 ]\n"
     ]
    }
   ],
   "source": [
    "# 输出CBOW习得的词嵌入\n",
    "print(\"\\nCBOW词嵌入:\")\n",
    "for word, idx in word_to_idx.items(): # 输出每个单词的嵌入向量\n",
    "    print(f\"{word}: \\\n",
    "    {cbow_model.input_to_hidden.weight[:, idx].detach().numpy()}\")  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "a1670078",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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aL2JiYmwtrbONf/VqUDg5dV1mZmZDDlEFQyDEREREZESB18TERERKTEYERERESkxGBEREREp8ao0vHye04MHD2BkZMSHPRIREZUTgiAgJSUFtra273xkUEExGAF48OABHBwcyroMIiIiKoJ79+6Jt+14XwxGAIyMjAC8/GCNjY3LuBoiIiIqCLlcDgcHB/F3vDgwGAHi6TNjY2MGIyIionKmOIfBcPA1ERERkRKDEREREZESgxERERGREoMRERERlbjQ0FBIJBLxZWpqivbt2+Pff/8t69JUMBgRERFRqdm6dSvCwsKwe/duCIKAjh07IjU1tazLEvGqNCIiIio19evXh6urKwDA3t4etWvXxpkzZ9CxY8eyLUyJR4yIiIioTLy6W3V6enoZV/J/DEZERERU6pKTkzFz5kyYmJigVatWAIAjR47A1dUVOjo6aNCgAXbv3q3S5+rVq2jXrh2MjY1hZWWFMWPGqCxXKBQYO3YsbG1tYWBggBYtWuDixYuFqovBiIiIiEpNkyZNIJFIYGFhgZ07d2LXrl2wsLBAaGgoPv74Y7i5ueHgwYPw9vZG7969sW/fPrFv9+7dkZmZiT///BMrVqxASEiIyrrnzZuHdevWYeHChfjzzz9hZ2eH7t27QxCEAtfHMUZERERUMnKygTt/A6kJwMMHAIDt27ejTp06uH//PgICAtCvXz+cPXsWs2bNgoeHB9auXQsAaNeuHW7duoUZM2aga9euyMrKwv379zFy5Ei0adMGAGBjYwMvLy9xc3FxcahWrRq++OILSCQSNG7cGBcuXEBWVha0tLQKVDKDERERERW/qL3A4cmA/GUgQlwWAKCO5kO4un4OV1dXeHp6wsrKCj/++CPCwsIwceJElVW0a9cOEydORGZmJrS0tDBy5EhMnz4dp06dgru7O1q3bq3SfvDgwdixYwdcXFzQunVrtGzZEj179ixwKAJ4Ko2IiIiKW9ReIPjL/4ei1x2b/nI5AHNzc1hYWCAuLg6CIOR65plUKoUgCOKpsOXLl+Ps2bNo06YNwsPD4e3trdLey8sLt27dgq+vLzIzM/H111+jefPmhRrczWBERERExScn++WRIuQzruewH5CTjaSkJDx+/Bg2NjZwd3fHiRMnVJqFhISgcePG0NbWxv379zFu3Dg0atQIvr6+OHDgAAYOHKjSfv78+bh58ya+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IiKiIir04Os3n/ad1zwiekkilcC0q3OeV6UBgGlXJ0ikhfseeXh4qDxkloiI3l+RB1+/cuXKFTx79gyxsbF49uwZjh49qnJnXiIC9BpawqJ/vVxHjjRMdGDRvx70GlqWUWVERPS6Il2u/7pDhw7hwYMHyMjIwJMnT8QneRORKr2GltCtbwFFrAw5KRmQGmlDp4ZJoY8UERFRyXnvI0b+/v6oV68ePv30U9SrVw+7d+/mzeOI8iCRSqDrbAp9V2voOpsyFBERqZn3DkYAxMcNEBEREZVnBT6VdufOHQiCgKCgIFhYWODVVf779u3DgwcPkJCQAEEQkJ2dXWLFEhEREZWkAh8x6tOnDwYPHgxra2t4eXkhNTUVtWrVgiAIaNOmDWrWrAmFQiEGJCIiIqLypsA3eHxT/fr1ERUVpTIvMzMTWlpaaNKkSbm6+zVv8EhERFT+lOkNHt/k6+uba96rB1geOXKk6BURERERlZFCX67frl076OrqQkNDA7t37861XF9fH0OGDEH79u2LpUAiIiKi0lLoYPTXX39hzZo1eS6PiYnBpEmTytWpNCIiIiKgCMFIU1MTAwcOzHN5REQEgoOD36soIiIiorLwXne+/vTTT6GnpwcAyMjIwPbt21GzZk1ER0cXS3FEREREpem9bvB44sQJODs7w8nJCUePHgUAGBgYQFPzvZ80QkRERFTq3ivBmJubY+bMmQCAjRs3FktBRERERGWlwEeMrl27BgAqN298/TEgfCQIERERlXcFOmKUmJgIV1dXuLu7qwSgpKQkfPvttxAEAcnJySVWJBEREVFpKNARI2tra9y9exfDhg1TmT9y5EhYWFjA0tISo0aNKpECiYiIiEpLoR8Joq+vj7S0tJKqp0zwkSBERETlT0n8fhd68LVCoUDbtm3zbWNoaIi9e/cWuSgiIiKislDoYLR+/Xro6elBQ0PjrctfvHjBgdhERERULhU6GOV312siIiKi8uy9bvBIREREVJEwGBEREREpMRgRERERKTEYERERESkxGBEREREpMRgRERERKTEYERERESkxGBEREREpMRgRERERKTEYERERESkxGBEREREpMRgRERERKallMIqMjIS7uzvMzMzg6+sLQRDe2efUqVOoV68eLC0tsWjRolKokoiIiCoatQtGCoUCXbt2RdOmTREeHo6oqCgEBQXl2ycp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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.rcParams[\"font.family\"]=['SimHei'] # 用来设定字体样式\n",
    "plt.rcParams['font.sans-serif']=['SimHei'] # 用来设定无衬线字体样式\n",
    "plt.rcParams['axes.unicode_minus']=False # 用来正常显示负号\n",
    "# 绘制二维词向量图\n",
    "fig, ax = plt.subplots() \n",
    "for word, idx in word_to_idx.items():\n",
    "    vec = cbow_model.input_to_hidden.weight[:, \\\n",
    "            idx].detach().numpy() # 获取每个单词的嵌入向量\n",
    "    ax.scatter(vec[0], vec[1]) # 在图中绘制嵌入向量的点\n",
    "    ax.annotate(word, (vec[0], vec[1]), fontsize=12) # 点旁添加单词标签\n",
    "plt.title('2维词嵌入') # 图题\n",
    "plt.xlabel('向量维度1') # X轴Label\n",
    "plt.ylabel('向量维度2') # Y轴Label\n",
    "plt.show() # 显示图"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "27c673b0",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
